草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 为什么STL要为Allocator预留接口(interface)?

STL为什么要为Allocator预留接口(interface)?以vector为例:template>classvector;因为我们有很多选择来分配内存和构造对象,比如operatornew,delete,new[],delete[],它几乎可以做我们创建对象时需要做的任何事情。那么,为什么像vector这样的STL容器需要一个Allocator接口(interface),如果我们不分配一个,它在大多数情况下都是默认的std::allocator?为什么不直接使用新的表达式呢?如果目的是使用户定义的分配行为成为可能,为什么不让用户提供他们自己定义的operatornew、new[]

c++ - 计算 STL map 不相交子范围平均值的有效方法

我正在将算法从C#转换为C++。该算法的一小部分是计算字典中某些区域的平均值。字典中数据的存储方式如下:IndexValue11032829078111090我需要计算索引小于某个数字的所有值和大于某个数字的所有索引值的平均值。在C#中,我按以下方式进行:if(dictionary.Where(x=>x.Key0){avgValue=(int)dictionary.Where(x=>x.Keyx.Value);}for(vari=0;ix.Key>(rightBorder)).Count()>0){avgValue=(int)dictionary.Where(x=>x.Key>(rig

c++ - 可以将具有 Base 类型的 STL 容器转换为 Derived 类型吗?

是否可以将STL容器从Base类型转换为Derived类型?例如,我有两个vector。第一个是基类类型,第二个是派生类类型。classBase{//Code};classDerive:publicBase{//Code};用法vector*vec_base=newvector;//AddsomeDerivetypedatatovec_basevector*vec_derive=(vector*)(vec_base);//UsingelementsasDerivepointers.Worksfine.这样可以吗?(它工作正常,但我想对此发表一些评论)。非常感谢你。编辑:根据答案更新。说

具有私有(private)复制构造函数的类的 C++ STL vector ?

我们的代码中有一个类,比如类C.我想创建一个C类对象的vector.但是,复制构造函数和赋值运算符都被特意声明为private。.我不想(也许不允许)改变它。是否有任何其他干净的方法来使用/定义vector? 最佳答案 你可以使用vector或vector>相反。 关于具有私有(private)复制构造函数的类的C++STLvector?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

c++ - 如何找到 map 的中间元素?? STL

您好,我在STL库/C++中的Map概念之间徘徊。intarr[]={10,15,14,13,17,15,16,12,18,10,29,24,35,36};intn=sizeofarr/sizeof*arr;mapbst;map::iteratorit;vectormedian_output;constintk=5;for(inti=0;i现在当我打印这张map时,它是按排序顺序打印的。现在有什么最简单的方法可以找到这张map的中间点.....需要找到更大问题的中位数...所以尝试实现平衡二叉搜索树.. 最佳答案 map是一棵平衡搜

c++ - 防止在 STL 容器中释放内存

我有一个经常重复使用的STL容器(std::list)。我的意思是我将一些元素插入容器在处理过程中移除元素清理容器冲洗并重复多次当使用callgrind进行分析时,我看到大量调用new(malloc)和delete(free)这可能非常昂贵。因此,我正在寻找某种方法来优先预分配相当多的元素。我还希望我的分配池继续增加,直到达到高水位线,并且分配池继续卡在内存上,直到容器本身被删除。不幸的是,标准分配器会不断调整内存池的大小,因此我正在寻找能够执行上述操作而无需自己编写的分配器。是否存在这样的分配器,我在哪里可以找到这样的分配器?我在使用GCC的Linux和使用STLPort的Andro

c++ - STL 容器的二进制兼容性

假设我用C++编写了一个DLL,并希望导出一个采用std::vector参数的方法。我可以希望不同的STL版本之间有任何二进制兼容性吗? 最佳答案 我不知道版本之间有任何兼容性保证,甚至在同一编译器上的发布和调试之间也没有。一个解决方案是为vector创建一个包装器。创建一个类,它具有容器所需的所有功能,并根据对私有(private)vector的操作来实现它们,私有(private)vector是该类的唯一成员。将所有类代码保留在DLL中。 关于c++-STL容器的二进制兼容性,我们在

c++ - 在 C++11 基于范围的 'for' 循环中获取对 STL 容器元素的引用

for(Somethingsomething:setOfSomething)//OKfor(Somethingconst&something:setOfSomething)//OKfor(Something&something:setOfSomething)//ERRORerror:invalidinitializationofreferenceoftype'Something&'fromexpressionoftype'constSomething'迭代器从什么时候开始返回constSomething?它应该返回Something&或Somethingconst&。由于基于范围的“f

c++ - 这两种比较STL vector 的方法有什么区别?

很少有在线示例使用相等运算符来比较两个STLvector对象的内容,以验证它们是否具有相同的内容。vectorv1;//addsomeelementstov1vectorv2;//addsomeelementstov2if(v1==v2)cout相反,我阅读了其他示例,其中std::equal()使用函数。boolcompare_vector(constvector&v1,constvector&v2){returnv1.size()==v2.size()&&std::equal(v1.begin(),v1.end(),v2.begin());}这两种比较STLvector的方式有什么

c++ - 为什么C++中的大括号初始化解决了STL容器的初始化问题?

我正在阅读EffectiveModernC++,在关于大括号初始化的部分。Evenwithseveralinitializationsyntaxes,thereweresomesituationswhereC++98hadnowaytoexpressadesiredinitialization.Forexample,itwasn’tpossibletodirectlyindicatethatanSTLcontainershouldbecreatedholdingaparticularsetofvalues(e.g.,1,3,and5)然后他显示:std::vectorv{1,3,5};